/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trabalho.pkg3;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Victor
 */
//Nó servidor central
//Contem a lista de nós na rede
//Contem a lista de arquivos que cada nó possui
public class Servidor extends Thread {

    private ServerSocket servidor;
    private Socket socket;
    private ObjectOutputStream out;
    private ObjectInputStream in;
    private String msg;

    public Servidor(int port) throws IOException {
        servidor = new ServerSocket(port); //servidor porta 60050
    }

    @Override
    public void run() {
        while (true) {
            try {
                socket = servidor.accept(); //aceita conexão
                out = new ObjectOutputStream(socket.getOutputStream()); //Buffer de envio dados
                in = new ObjectInputStream(socket.getInputStream()); //Buffer de recebimento dados

                msg = (String) in.readObject();

                switch (msg) {
                    case "Adicionar":

                        break;
                    case "Remover":

                        break;
                    case "Atualizar":
                        long inicio1 = System.currentTimeMillis();
                        int count = (int) in.readObject(); //quantidade de arquivos que serão enviados
                        String aux1 = (String) in.readObject(); //nome do cliente
                        InfoArq aux2;
                        for (int i = 0; i < count; i++) {
                            aux2 = new InfoArq((String) in.readObject()); //cria e recebe  arquivo
                            if (!aux2.load()) {
                                aux2.setHosts(aux1);
                                aux2.setSize((long) in.readObject());
                                aux2.grava();
                            } else {
                                if (!aux2.verificar(aux1)) { // verifica se o servidor não tem informação deste arquivo
                                    long a = (long) in.readObject();
                                    aux2.atualizar_host(aux1); //neste cliente
                                    aux2.grava();
                                } else {
                                    long a = (long) in.readObject();
                                }
                            }
                        }
                        long fim1 = System.currentTimeMillis();
                        System.out.println("Servidor - Tempo de Atualização: " + (fim1 - inicio1) + " milisegundos");
                        break;

                    case "Download":
                        long inicio2 = System.currentTimeMillis();
                        msg = (String) in.readObject();
                        InfoArq aux = new InfoArq(msg);
                        if (!aux.load()) {
                            out.flush();
                            out.writeObject("Arquivo não existe");
                        } else {
                            out.flush();
                            out.writeObject(aux.getHosts());
                        }
                        long fim2 = System.currentTimeMillis();
                        System.out.println("Servidor - Tempo de Comunicação: " + (fim2 - inicio2) + " milisegundos");
                        break;
                }

                in.close();
                out.close();
                socket.close();

            } catch (ClassNotFoundException | IOException ex) {
                Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void Atualizar() {
    }
    //envia menssagem via socket

    void sendMessage(String msg) {
        try {
            out.writeObject(msg);
            out.flush();
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
    }
}
